/*
 * @(#)XfspThresholdPruneSimplifier.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.rulebases;

import xfuzzy.lang.Rule;
import xfuzzy.lang.KnowledgeBase;
import xfuzzy.lang.RuleSet;

/**
 * <p> <b>Descripci�n:</b> clase de objetos que permiten la simplificaci�n de
 * bases de reglas mediante la conservaci�n de �nicamente aquellas reglas cuyo
 * grado de activaci�n superen un cierto umbral.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 1.3
 * @see XfspModel
 * @see XfspPrunning
 *
 */
public class XfspThresholdPruneSimplifier
    extends XfspPruneSimplifier {

  //umbral que debe superar el grado de activaci�n de aquellas reglas que ser�n
  //conservadas tras el podado
  private double threshold;

  /**
   * <p> <b>Descripci�n:</b> crea un simplificador de bases de reglas de
   * sistemas difusos que conserva �nicamente aquellas reglas cuyo grado de
   * activaci�n m�xima supere un umbral.
   * @param pattern Patr�n de datos para las entradas de las reglas.
   * @param threshold Umbral que debe superar el grado de activaci�n m�ximo de
   * una regla de la base de reglas para ser conservada.
   *
   */
  public XfspThresholdPruneSimplifier(double[][] pattern, double threshold) {
    //llama al constructor de la superclase
    super(pattern);
    //establece el umbral que debe superar el grado de activaci�n m�ximo de una
    //regla para permanecer en la base de reglas que se podar�
    this.threshold = threshold;
  }

  /**
   * <p> <b>Descripci�n:</b> hace el podado de una base de reglas por
   * eliminaci�n de aquellas reglas cuya grado de activaci�n m�ximo no supere
   * un determinado umbral.
   * @param rulebase Base de reglas que se quiere podar.
   *
   */
  protected void prune(KnowledgeBase rulebase) { //, Specification spec) {
    //obtiene las reglas de la base de reglas a podar
    Rule[] rules = ((RuleSet) rulebase).getRules();
    //para cada una de las reglas de la base de reglas...
    for (int i = 0; i < rules.length; i++) {
      //...si su grado de activaci�n m�ximo no supera el umbral fijado...
      if (rules[i].getMaxActivation() < threshold) {
        //...la regla es eliminada de la base de reglas
    	  ((RuleSet) rulebase).remove(rules[i]);
      }
    }
  }
}
